package com.sanyue.springboot.config;

import com.sanyue.springboot.bean.Car;
import com.sanyue.springboot.bean.Monster;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.format.FormatterRegistry;
import org.springframework.util.ObjectUtils;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 自定义转换器
 * @author: Guan
 **/
//@Configuration(proxyBeanMethods = false)
//这是一个配置类，使用Lite模式（轻量级，不需要动态代理，每次返回的组件都是新创建的）
@Configuration(proxyBeanMethods = false)
public class WebConfig {

    /**
     * 配置Car类型的自定义转换器
     * addFormatters:格式化程序
     * @return
     */
    @Bean
    public WebMvcConfigurer webMvcConfigurer(){
        return new WebMvcConfigurer() {
            @Override
            public void addFormatters(FormatterRegistry registry) {
                /**
                 *  解读：
                 *    1.registry.addConverter：我们addFormatters方法中，添加一个自定义转换器
                 *    2.转换类型：String -> Car
                 *    3.增加的自定义转换器会添加到Converts 容器中
                 *    4.converts 底层结构是 ConcurrentHashMap，内置有124种转换器（不同版本数量可能不同）
                 *      注意：本文多了一个是因为我们自定义了一个转换器
                 *    5.debug :
                 *      左面：convert:192, GenericConversionService (org.springframework.core.convert.support)
                 *      后this.converts.converters
                 *      右键最后一个（简写CDV），选择Enable alternative view for Collections classes
                 */
                registry.addConverter(new Converter<String, Car>() {
                    /**
                     * 解读：
                     *   1.new Converter<String, Car>() …… ： 虚拟内部类
                     *   2.实现Converter接口的convert方法
                     *   3.如果传入的字符串为空，则返回null
                     *   4.如果不为空，则返回对应pojo类
                     *   5.car对象返回的地点是 public String saveMonster(Monster monster)
                     *     monster对象的car属性
                     */
                    @Override
                    public Car convert(String s) { //s -> source -> 对应前端传过来的字符串（value值），value="法拉利,80031000.10"
                        //在这里我们实现业务
                        //判断字符串是否为空
                        if(!ObjectUtils.isEmpty(s)){
                            Car car = new Car();
                            //自定义分隔符
                            String[] split = s.split(",");
                            car.setName(split[0]);
                            //记得转换类型
                            car.setPrice(Double.parseDouble(split[1]));
                            //返回对应类
                            return car;
                        }
                        return null;
                    }
                });

//                //还可以增加更多的自定义转换器
//                //debug发现size = 126
//                //
//                registry.addConverter(new Converter<String, Monster>() {
//                    @Override
//                    public Monster convert(String s) {
//                        System.out.println("ok");
//                        return null;
//                    }
//                });
//
//                /**
//                 *  第三个自定义转换器（用来显示如果转换类型相同会出现什么问题，取哪一个转换器）
//                 *  解读：
//                 *    1.converts容器是HashMap类型，key取值唯一
//                 *      converts的key的值【原类型 -> 目标类型】
//                 *      所以俩个Converter<String, Monster>会发生冲突
//                 *    2.结果：后面的自定义转换器会覆盖掉前面的转换器
//                 *    3.debug：
//                 *      3.1 我们发现converts的size = 126，即俩个相同的自定义转换器指保留了一个
//                 *      3.2 我们分别在俩个转换器都增加了一个断点，发现只有后面的转换器被执行了
//                 *      3.3 返回值为null，就表示没有接收，即Monster的car属性为null
//                 */
//                registry.addConverter(new Converter<String,Car>() {
//                    @Override
//                    public Car convert(String s) {
//                        System.out.println("ok1");
//                        return null;
//                    }
//                });


            }
        };
    }
}
